{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "MhoQ0WE77laV"
      },
      "source": [
        "##### Copyright 2020 The TensorFlow Authors."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "_ckMIh7O7s6D"
      },
      "outputs": [],
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "jYysdyb-CaWM"
      },
      "source": [
        "# Train and serve a TensorFlow model with TensorFlow Serving"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "E6FwTNtl3S4v"
      },
      "source": [
        "**Warning: This notebook is designed to be run in a Google Colab only**.  It installs packages on the system and requires root access.  If you want to run it in a local Jupyter notebook, please proceed with caution.\n",
        "\n",
        "Note: You can run this example right now in a Jupyter-style notebook, no setup required!  Just click \"Run in Google Colab\"\n",
        "\n",
        "<div class=\"devsite-table-wrapper\"><table class=\"tfo-notebook-buttons\" align=\"left\">\n",
        "<tr><td><a target=\"_blank\" href=\"https://www.tensorflow.org/tfx/tutorials/serving/rest_simple\">\n",
        "<img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" />View on TensorFlow.org</a></td>\n",
        "<td><a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/tfx/blob/master/docs/tutorials/serving/rest_simple.ipynb\">\n",
        "<img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\">Run in Google Colab</a></td>\n",
        "<td><a target=\"_blank\" href=\"https://github.com/tensorflow/tfx/blob/master/docs/tutorials/serving/rest_simple.ipynb\">\n",
        "<img width=32px src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\">View source on GitHub</a></td>\n",
        "</tr></table></div>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FbVhjPpzn6BM"
      },
      "source": [
        "This guide trains a neural network model to classify [images of clothing, like sneakers and shirts](https://github.com/zalandoresearch/fashion-mnist), saves the trained model, and then serves it with [TensorFlow Serving](https://www.tensorflow.org/serving/).  The focus is on TensorFlow Serving, rather than the modeling and training in TensorFlow, so for a complete example which focuses on the modeling and training see the [Basic Classification example](https://github.com/tensorflow/docs/blob/master/site/en/r1/tutorials/keras/basic_classification.ipynb).\n",
        "\n",
        "This guide uses [tf.keras](https://github.com/tensorflow/docs/blob/master/site/en/r1/guide/keras.ipynb), a high-level API to build and train models in TensorFlow."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "FWkuJabJSKGB"
      },
      "outputs": [],
      "source": [
        "import sys\n",
        "\n",
        "# Confirm that we're using Python 3\n",
        "assert sys.version_info.major is 3, 'Oops, not running Python 3. Use Runtime > Change runtime type'"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "id": "dzLKpmZICaWN"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Installing dependencies for Colab environment\n",
            "\u001b[K     |████████████████████████████████| 2.4MB 4.6MB/s \n",
            "\u001b[?25hInstalling TensorFlow\n",
            "TensorFlow 2.x selected.\n",
            "TensorFlow version: 2.1.0-rc1\n"
          ]
        }
      ],
      "source": [
        "# TensorFlow and tf.keras\n",
        "print(\"Installing dependencies for Colab environment\")\n",
        "!pip install -Uq grpcio==1.26.0\n",
        "\n",
        "import tensorflow as tf\n",
        "from tensorflow import keras\n",
        "\n",
        "# Helper libraries\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import os\n",
        "import subprocess\n",
        "\n",
        "print('TensorFlow version: {}'.format(tf.__version__))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "5jAk1ZXqTJqN"
      },
      "source": [
        "## Create your model"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "yR0EdgrLCaWR"
      },
      "source": [
        "### Import the Fashion MNIST dataset\n",
        "\n",
        "This guide uses the [Fashion MNIST](https://github.com/zalandoresearch/fashion-mnist) dataset which contains 70,000 grayscale images in 10 categories. The images show individual articles of clothing at low resolution (28 by 28 pixels), as seen here:\n",
        "\n",
        "<table>\n",
        "  <tr><td>\n",
        "    <img src=\"https://tensorflow.org/images/fashion-mnist-sprite.png\"\n",
        "         alt=\"Fashion MNIST sprite\"  width=\"600\">\n",
        "  </td></tr>\n",
        "  <tr><td align=\"center\">\n",
        "    <b>Figure 1.</b> <a href=\"https://github.com/zalandoresearch/fashion-mnist\">Fashion-MNIST samples</a> (by Zalando, MIT License).<br/>&nbsp;\n",
        "  </td></tr>\n",
        "</table>\n",
        "\n",
        "Fashion MNIST is intended as a drop-in replacement for the classic [MNIST](http://yann.lecun.com/exdb/mnist/) dataset—often used as the \"Hello, World\" of machine learning programs for computer vision. You can access the Fashion MNIST directly from TensorFlow, just import and load the data.\n",
        "\n",
        "Note: Although these are really images, they are loaded as NumPy arrays and not binary image objects."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "id": "7MqDQO0KCaWS"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz\n",
            "32768/29515 [=================================] - 0s 0us/step\n",
            "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz\n",
            "26427392/26421880 [==============================] - 0s 0us/step\n",
            "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz\n",
            "8192/5148 [===============================================] - 0s 0us/step\n",
            "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz\n",
            "4423680/4422102 [==============================] - 0s 0us/step\n",
            "\n",
            "train_images.shape: (60000, 28, 28, 1), of float64\n",
            "test_images.shape: (10000, 28, 28, 1), of float64\n"
          ]
        }
      ],
      "source": [
        "fashion_mnist = keras.datasets.fashion_mnist\n",
        "(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()\n",
        "\n",
        "# scale the values to 0.0 to 1.0\n",
        "train_images = train_images / 255.0\n",
        "test_images = test_images / 255.0\n",
        "\n",
        "# reshape for feeding into the model\n",
        "train_images = train_images.reshape(train_images.shape[0], 28, 28, 1)\n",
        "test_images = test_images.reshape(test_images.shape[0], 28, 28, 1)\n",
        "\n",
        "class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',\n",
        "               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']\n",
        "\n",
        "print('\\ntrain_images.shape: {}, of {}'.format(train_images.shape, train_images.dtype))\n",
        "print('test_images.shape: {}, of {}'.format(test_images.shape, test_images.dtype))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "PDu7OX8Nf5PY"
      },
      "source": [
        "### Train and evaluate your model\n",
        "\n",
        "Let's use the simplest possible CNN, since we're not focused on the modeling part."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "id": "LTNN0ANGgA36"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Model: \"sequential\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "Conv1 (Conv2D)               (None, 13, 13, 8)         80        \n",
            "_________________________________________________________________\n",
            "flatten (Flatten)            (None, 1352)              0         \n",
            "_________________________________________________________________\n",
            "Softmax (Dense)              (None, 10)                13530     \n",
            "=================================================================\n",
            "Total params: 13,610\n",
            "Trainable params: 13,610\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n",
            "Train on 60000 samples\n",
            "Epoch 1/5\n",
            "60000/60000 [==============================] - 11s 185us/sample - loss: 0.5466 - accuracy: 0.8087\n",
            "Epoch 2/5\n",
            "60000/60000 [==============================] - 5s 79us/sample - loss: 0.4032 - accuracy: 0.8580\n",
            "Epoch 3/5\n",
            "60000/60000 [==============================] - 5s 76us/sample - loss: 0.3613 - accuracy: 0.8712\n",
            "Epoch 4/5\n",
            "60000/60000 [==============================] - 5s 75us/sample - loss: 0.3406 - accuracy: 0.8797\n",
            "Epoch 5/5\n",
            "60000/60000 [==============================] - 4s 75us/sample - loss: 0.3247 - accuracy: 0.8848\n",
            "10000/10000 [==============================] - 1s 73us/sample - loss: 0.3510 - accuracy: 0.8747\n",
            "\n",
            "Test accuracy: 0.8747000098228455\n"
          ]
        }
      ],
      "source": [
        "model = keras.Sequential([\n",
        "  keras.layers.Conv2D(input_shape=(28,28,1), filters=8, kernel_size=3, \n",
        "                      strides=2, activation='relu', name='Conv1'),\n",
        "  keras.layers.Flatten(),\n",
        "  keras.layers.Dense(10, activation=tf.nn.softmax, name='Softmax')\n",
        "])\n",
        "model.summary()\n",
        "\n",
        "testing = False\n",
        "epochs = 5\n",
        "\n",
        "model.compile(optimizer='adam', \n",
        "              loss='sparse_categorical_crossentropy',\n",
        "              metrics=['accuracy'])\n",
        "model.fit(train_images, train_labels, epochs=epochs)\n",
        "\n",
        "test_loss, test_acc = model.evaluate(test_images, test_labels)\n",
        "print('\\nTest accuracy: {}'.format(test_acc))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "AwGPItyphqXT"
      },
      "source": [
        "## Save your model\n",
        "\n",
        "To load our trained model into TensorFlow Serving we first need to save it in [SavedModel](https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/saved_model) format.  This will create a protobuf file in a well-defined directory hierarchy, and will include a version number.  [TensorFlow Serving](https://www.tensorflow.org/tfx/guide/serving) allows us to select which version of a model, or \"servable\" we want to use when we make inference requests.  Each version will be exported to a different sub-directory under the given path."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "id": "0w5Rq8SsgWE6"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "export_path = /tmp/1\n",
            "\n",
            "WARNING:tensorflow:From /tensorflow-2.1.0/python3.6/tensorflow_core/python/ops/resource_variable_ops.py:1786: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.\n",
            "Instructions for updating:\n",
            "If using Keras pass *_constraint arguments to layers.\n",
            "INFO:tensorflow:Assets written to: /tmp/1/assets\n",
            "\n",
            "Saved model:\n",
            "total 84\n",
            "drwxr-xr-x 2 root root  4096 Jan  7 23:15 assets\n",
            "-rw-r--r-- 1 root root 74086 Jan  7 23:15 saved_model.pb\n",
            "drwxr-xr-x 2 root root  4096 Jan  7 23:15 variables\n"
          ]
        }
      ],
      "source": [
        "# Fetch the Keras session and save the model\n",
        "# The signature definition is defined by the input and output tensors,\n",
        "# and stored with the default serving key\n",
        "import tempfile\n",
        "\n",
        "MODEL_DIR = tempfile.gettempdir()\n",
        "version = 1\n",
        "export_path = os.path.join(MODEL_DIR, str(version))\n",
        "print('export_path = {}\\n'.format(export_path))\n",
        "\n",
        "tf.keras.models.save_model(\n",
        "    model,\n",
        "    export_path,\n",
        "    overwrite=True,\n",
        "    include_optimizer=True,\n",
        "    save_format=None,\n",
        "    signatures=None,\n",
        "    options=None\n",
        ")\n",
        "\n",
        "print('\\nSaved model:')\n",
        "!ls -l {export_path}"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FM7B_RuDYoIj"
      },
      "source": [
        "## Examine your saved model\n",
        "\n",
        "We'll use the command line utility `saved_model_cli` to look at the [MetaGraphDefs](https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/MetaGraphDef) (the models) and [SignatureDefs](../signature_defs) (the methods you can call) in our SavedModel.  See [this discussion of the SavedModel CLI](https://github.com/tensorflow/docs/blob/master/site/en/r1/guide/saved_model.md#cli-to-inspect-and-execute-savedmodel) in the TensorFlow Guide."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "id": "LU4GDF_aYtfQ"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:\n",
            "\n",
            "signature_def['__saved_model_init_op']:\n",
            "  The given SavedModel SignatureDef contains the following input(s):\n",
            "  The given SavedModel SignatureDef contains the following output(s):\n",
            "    outputs['__saved_model_init_op'] tensor_info:\n",
            "        dtype: DT_INVALID\n",
            "        shape: unknown_rank\n",
            "        name: NoOp\n",
            "  Method name is: \n",
            "\n",
            "signature_def['serving_default']:\n",
            "  The given SavedModel SignatureDef contains the following input(s):\n",
            "    inputs['Conv1_input'] tensor_info:\n",
            "        dtype: DT_FLOAT\n",
            "        shape: (-1, 28, 28, 1)\n",
            "        name: serving_default_Conv1_input:0\n",
            "  The given SavedModel SignatureDef contains the following output(s):\n",
            "    outputs['Softmax'] tensor_info:\n",
            "        dtype: DT_FLOAT\n",
            "        shape: (-1, 10)\n",
            "        name: StatefulPartitionedCall:0\n",
            "  Method name is: tensorflow/serving/predict\n",
            "WARNING:tensorflow:From /tensorflow-2.1.0/python3.6/tensorflow_core/python/ops/resource_variable_ops.py:1786: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.\n",
            "Instructions for updating:\n",
            "If using Keras pass *_constraint arguments to layers.\n",
            "\n",
            "Defined Functions:\n",
            "  Function Name: '__call__'\n",
            "    Option #1\n",
            "      Callable with:\n",
            "        Argument #1\n",
            "          Conv1_input: TensorSpec(shape=(None, 28, 28, 1), dtype=tf.float32, name='Conv1_input')\n",
            "        Argument #2\n",
            "          DType: bool\n",
            "          Value: True\n",
            "        Argument #3\n",
            "          DType: NoneType\n",
            "          Value: None\n",
            "    Option #2\n",
            "      Callable with:\n",
            "        Argument #1\n",
            "          inputs: TensorSpec(shape=(None, 28, 28, 1), dtype=tf.float32, name='inputs')\n",
            "        Argument #2\n",
            "          DType: bool\n",
            "          Value: True\n",
            "        Argument #3\n",
            "          DType: NoneType\n",
            "          Value: None\n",
            "    Option #3\n",
            "      Callable with:\n",
            "        Argument #1\n",
            "          inputs: TensorSpec(shape=(None, 28, 28, 1), dtype=tf.float32, name='inputs')\n",
            "        Argument #2\n",
            "          DType: bool\n",
            "          Value: False\n",
            "        Argument #3\n",
            "          DType: NoneType\n",
            "          Value: None\n",
            "    Option #4\n",
            "      Callable with:\n",
            "        Argument #1\n",
            "          Conv1_input: TensorSpec(shape=(None, 28, 28, 1), dtype=tf.float32, name='Conv1_input')\n",
            "        Argument #2\n",
            "          DType: bool\n",
            "          Value: False\n",
            "        Argument #3\n",
            "          DType: NoneType\n",
            "          Value: None\n",
            "\n",
            "  Function Name: '_default_save_signature'\n",
            "    Option #1\n",
            "      Callable with:\n",
            "        Argument #1\n",
            "          Conv1_input: TensorSpec(shape=(None, 28, 28, 1), dtype=tf.float32, name='Conv1_input')\n",
            "\n",
            "  Function Name: 'call_and_return_all_conditional_losses'\n",
            "    Option #1\n",
            "      Callable with:\n",
            "        Argument #1\n",
            "          inputs: TensorSpec(shape=(None, 28, 28, 1), dtype=tf.float32, name='inputs')\n",
            "        Argument #2\n",
            "          DType: bool\n",
            "          Value: True\n",
            "        Argument #3\n",
            "          DType: NoneType\n",
            "          Value: None\n",
            "    Option #2\n",
            "      Callable with:\n",
            "        Argument #1\n",
            "          inputs: TensorSpec(shape=(None, 28, 28, 1), dtype=tf.float32, name='inputs')\n",
            "        Argument #2\n",
            "          DType: bool\n",
            "          Value: False\n",
            "        Argument #3\n",
            "          DType: NoneType\n",
            "          Value: None\n",
            "    Option #3\n",
            "      Callable with:\n",
            "        Argument #1\n",
            "          Conv1_input: TensorSpec(shape=(None, 28, 28, 1), dtype=tf.float32, name='Conv1_input')\n",
            "        Argument #2\n",
            "          DType: bool\n",
            "          Value: False\n",
            "        Argument #3\n",
            "          DType: NoneType\n",
            "          Value: None\n",
            "    Option #4\n",
            "      Callable with:\n",
            "        Argument #1\n",
            "          Conv1_input: TensorSpec(shape=(None, 28, 28, 1), dtype=tf.float32, name='Conv1_input')\n",
            "        Argument #2\n",
            "          DType: bool\n",
            "          Value: True\n",
            "        Argument #3\n",
            "          DType: NoneType\n",
            "          Value: None\n"
          ]
        }
      ],
      "source": [
        "!saved_model_cli show --dir {export_path} --all"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "lSPWuegUb7Eo"
      },
      "source": [
        "That tells us a lot about our model!  In this case we just trained our model, so we already know the inputs and outputs, but if we didn't this would be important information.  It doesn't tell us everything, like the fact that this is grayscale image data for example, but it's a great start."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DBgsyhytS6KD"
      },
      "source": [
        "## Serve your model with TensorFlow Serving\n",
        "\n",
        "### Add TensorFlow Serving distribution URI as a package source:\n",
        "\n",
        "We're preparing to install TensorFlow Serving using [Aptitude](https://wiki.debian.org/Aptitude) since this Colab runs in a Debian environment.  We'll add the `tensorflow-model-server` package to the list of packages that Aptitude knows about.  Note that we're running as root.\n",
        "\n",
        "Note: This example is running TensorFlow Serving natively, but [you can also run it in a Docker container](https://www.tensorflow.org/tfx/serving/docker), which is one of the easiest ways to get started using TensorFlow Serving."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "id": "EWg9X2QHlbGS"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "deb http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal\n",
            "  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n",
            "                                 Dload  Upload   Total   Spent    Left  Speed\n",
            "100  2943  100  2943    0     0  11496      0 --:--:-- --:--:-- --:--:-- 11496\n",
            "OK\n",
            "Get:1 http://storage.googleapis.com/tensorflow-serving-apt stable InRelease [3,012 B]\n",
            "Get:2 https://cloud.r-project.org/bin/linux/ubuntu bionic-cran35/ InRelease [3,626 B]\n",
            "Ign:3 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64  InRelease\n",
            "Ign:4 https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64  InRelease\n",
            "Hit:5 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64  Release\n",
            "Get:6 https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64  Release [564 B]\n",
            "Get:7 https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64  Release.gpg [833 B]\n",
            "Hit:8 http://ppa.launchpad.net/graphics-drivers/ppa/ubuntu bionic InRelease\n",
            "Hit:9 http://archive.ubuntu.com/ubuntu bionic InRelease\n",
            "Get:10 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]\n",
            "Get:11 http://storage.googleapis.com/tensorflow-serving-apt stable/tensorflow-model-server amd64 Packages [354 B]\n",
            "Get:12 https://cloud.r-project.org/bin/linux/ubuntu bionic-cran35/ Packages [81.6 kB]\n",
            "Get:13 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]\n",
            "Get:14 http://storage.googleapis.com/tensorflow-serving-apt stable/tensorflow-model-server-universal amd64 Packages [364 B]\n",
            "Get:15 http://ppa.launchpad.net/marutter/c2d4u3.5/ubuntu bionic InRelease [15.4 kB]\n",
            "Get:17 https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64  Packages [30.4 kB]\n",
            "Get:18 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]\n",
            "Get:19 http://ppa.launchpad.net/marutter/c2d4u3.5/ubuntu bionic/main Sources [1,749 kB]\n",
            "Get:20 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [796 kB]\n",
            "Get:21 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [1,073 kB]\n",
            "Get:22 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [776 kB]\n",
            "Get:23 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [21.3 kB]\n",
            "Get:24 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [10.8 kB]\n",
            "Get:25 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [1,324 kB]\n",
            "Get:26 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [35.5 kB]\n",
            "Get:27 http://ppa.launchpad.net/marutter/c2d4u3.5/ubuntu bionic/main amd64 Packages [844 kB]\n",
            "Fetched 7,019 kB in 4s (1,913 kB/s)\n",
            "Reading package lists... Done\n",
            "Building dependency tree       \n",
            "Reading state information... Done\n",
            "21 packages can be upgraded. Run 'apt list --upgradable' to see them.\n"
          ]
        }
      ],
      "source": [
        "# This is the same as you would do from your command line, but without the [arch=amd64], and no sudo\n",
        "# You would instead do:\n",
        "# echo \"deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal\" | sudo tee /etc/apt/sources.list.d/tensorflow-serving.list && \\\n",
        "# curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | sudo apt-key add -\n",
        "\n",
        "!echo \"deb http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal\" | tee /etc/apt/sources.list.d/tensorflow-serving.list && \\\n",
        "curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | apt-key add -\n",
        "!apt update"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "W1ZVp_VOU7Wu"
      },
      "source": [
        "### Install TensorFlow Serving\n",
        "\n",
        "This is all you need - one command line!"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {
        "id": "ygwa9AgRloYy"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Reading package lists... Done\n",
            "Building dependency tree       \n",
            "Reading state information... Done\n",
            "The following package was automatically installed and is no longer required:\n",
            "  libnvidia-common-430\n",
            "Use 'apt autoremove' to remove it.\n",
            "The following NEW packages will be installed:\n",
            "  tensorflow-model-server\n",
            "0 upgraded, 1 newly installed, 0 to remove and 21 not upgraded.\n",
            "Need to get 140 MB of archives.\n",
            "After this operation, 0 B of additional disk space will be used.\n",
            "Get:1 http://storage.googleapis.com/tensorflow-serving-apt stable/tensorflow-model-server amd64 tensorflow-model-server all 2.0.0 [140 MB]\n",
            "Fetched 140 MB in 2s (78.8 MB/s)\n",
            "Selecting previously unselected package tensorflow-model-server.\n",
            "(Reading database ... 145674 files and directories currently installed.)\n",
            "Preparing to unpack .../tensorflow-model-server_2.0.0_all.deb ...\n",
            "Unpacking tensorflow-model-server (2.0.0) ...\n",
            "Setting up tensorflow-model-server (2.0.0) ...\n"
          ]
        }
      ],
      "source": [
        "!apt-get install tensorflow-model-server"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "k5NrYdQeVm52"
      },
      "source": [
        "### Start running TensorFlow Serving\n",
        "\n",
        "This is where we start running TensorFlow Serving and load our model.  After it loads we can start making inference requests using REST.  There are some important parameters:\n",
        "\n",
        "* `rest_api_port`: The port that you'll use for REST requests.\n",
        "* `model_name`: You'll use this in the URL of REST requests.  It can be anything.\n",
        "* `model_base_path`: This is the path to the directory where you've saved your model.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "aUgp3vUdU5GS"
      },
      "outputs": [],
      "source": [
        "os.environ[\"MODEL_DIR\"] = MODEL_DIR"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {
        "id": "kJDhHNJVnaLN"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Starting job # 0 in a separate thread.\n"
          ]
        }
      ],
      "source": [
        "%%bash --bg \n",
        "nohup tensorflow_model_server \\\n",
        "  --rest_api_port=8501 \\\n",
        "  --model_name=fashion_model \\\n",
        "  --model_base_path=\"${MODEL_DIR}\" >server.log 2>&1\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "metadata": {
        "id": "IxbeiOCUUs2z"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "[warn] getaddrinfo: address family for nodename not supported\n",
            "[evhttp_server.cc : 238] NET_LOG: Entering the event loop ...\n"
          ]
        }
      ],
      "source": [
        "!tail server.log"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vwg1JKaGXWAg"
      },
      "source": [
        "## Make a request to your model in TensorFlow Serving\n",
        "\n",
        "First, let's take a look at a random example from our test data."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "metadata": {
        "id": "Luqm_Jyff9iR"
      },
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAAEcCAYAAAA81qNOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAV8UlEQVR4nO3de5RdVX0H8O/v3nllJjOZmWTyJC9I\ngPIQsFABC2ShiEtaFVrQ6lKgxS61olQXRVCQWsGy0KIWFwVqCghSSZe0KsirkhINUWRRJBBC3m+S\nmUzmkck87ty7+8fZAzeHu397OvcO+Q18P2vNSu7d57HPmfu959z7m32OOOdARPZkDnUHiKg0hpPI\nKIaTyCiGk8gohpPIKIaTyCiGk8gohpPIKIaTyCiGk8gohpPIKIaTyCiGk8gohpPIKIaTyCiGk8go\nhpPIKIaTyCiGk8gohpPIKIaTyCiGk8gohpPIKIaTyCiGk8gohpPIKIaTyCiGk8gohpPIKIaTyCiG\nk8gohpPIKIaTyCiGk8gohpPIKIaTyCiGk8gohpPIKIaTyCiGk8gohpPIqIqHU0TuFBEnIrdUetl+\n+U75+fB4rPPNIiLLRWR5hZa1wO+TyyqxvIlCRM4SkUdEZKeIDIjIdv/440XTLPH75r2jWJ4TketH\nue4rROSCMrp/kKpKLQgARGQSgIv8w4+JyJXOueFKrsO7C8DtJZ5fOw7rognCvzn/BMBPAXwOQCeA\n+QDOAfABAPeNYbGnAdg+ymmvAPAr34eyVTScAD4MoAnAw0h2xvsB/LzC6wCAHc65VeOwXJrYvgjg\nOQDnO+dc0fN3i8iYzhJH8zoTkVrn3OBYlq+p9GntxQD2AbgEQL9/fBARud6fKiwWkYdEZL+IbBGR\n68a6A0us46/Sp7kikhWR/xGRDSLS5J9bJCI/FJFNItIvIhtF5DYRaUkt7y5/enSyiKz0064VkfN8\n+xdFZLOI9IjIf4lIW2p+JyI3iMhX/HL6ReQpETlxFNvSJiL/IiI7RGRQRF4Wkb8e434Z2fdHi8ij\nItInIltF5FLf/gm//P0i8qSIHJGa/6Mi8ksRaffTPCcipX7HbSJyv98f+0Tk30Tkg37dS1LTXiAi\nq0TkgIh0icgyEZk3lu0D0ApgTyqYAADnXKHE9PUicquIdPife0WkOdW/g05ri/bhcX4f7gfwgIhs\n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\nJ5FRDCeRUQwnkVEMJ5FRDCeRUQwnkVEMJ5FRduucZcpMnhxse7Vbr5llq/U6ZVOTXi1s3xdZfkt4\n+NNwj15LjNUaGyPD4XqVYVkA0DAlvG1DPfpQunxt5LKcw2ozcoPhl+NAs34c0S+cOTHxyElkFMNJ\nZBTDSWQUw0lkFMNJZBTDSWQUw0lklN06p4vcqi5CZkwLtsXGRGYjYyr7+vVaY65frwcumr872LZp\n5xx13mnz9LGonT16HVP26X2raukLt804oM5b2KGvuxB5tbnB8HjQwcgQ26gyLqV6qPDISWQUw0lk\nFMNJZBTDSWQUw0lkFMNJZBTDSWSU4TpneXWpocNagm11NXq9LqZnY7PaLlOH1PZ3tm4Ltm3OH6bO\n2zpJ73tDjb7unS+Hx7kCgGj36XP69XoLkfGciJWulesBD04tr+49EfHISWQUw0lkFMNJZBTDSWQU\nw0lkFMNJZJTdUkqZ9s8JD+uqr+1S5x0a1ndLoV6/dOYJ83eo7et624JtmcjlI09s3q627xqcorZv\nbp6tttcow+lyA/p+aVuoD2fr6NAvGYr+8PILDWO/5SMADhkjosphOImMYjiJjGI4iYxiOImMYjiJ\njGI4iYx6y9Y5O48N173CVUY/774GfQJlaBMAXDn3F2r71ev+LNhW060v+8zGtWr7366/SG3PHtCX\n39MR3nbpD1+6EgD6m/XLbh4zf5fa/uKaueF11+h1zuzRi9T2/Jp1artFPHISGcVwEhnFcBIZxXAS\nGcVwEhnFcBIZxXASGWW3zlnm+Lzc9FywrRC5xKNEbgFY3a3X+06q0QdlttaFL2/ZoZcK0Zrdr7YP\nvqrfhq86NqwxF36/zvbp7+X9kVsjVrWO/fKWmWp93uGWyK0Px7zmQ4dHTiKjGE4ioxhOIqMYTiKj\nGE4ioxhOIqMYTiKj7NY5y7zOqPSFNy2vXJsVAKY167XEnjV6TW11Tq+qza7vDrZtCJdnAQDNGf0W\nf65GrwdmBvUaLZQar0TKlC1T+tR2bbsBYPWB8O+lUKhV5+1arP9OW1aqzSbxyElkFMNJZBTDSWQU\nw0lkFMNJZBTDSWQUw0lklN06Z0xGr9e52nBRbnqDXsd8acsstb0uUoLNucj1XfORQZuK9vwktf3s\nE9ao7U91H6+21+wOvySqIte8nVI3oLa3Vut10Nq94WPFgcP1+m7HO/W+tdytNpvEIyeRUQwnkVEM\nJ5FRDCeRUQwnkVEMJ5FRE7aUIlm9XHHKcRuCbUN5fbPnz96rtm+RqWr73KrwpS8BYFI2PC7MnaoP\nq6oT/bKbMS3Hdqjt7Tuag21DkVsfnj5to9q+oU+/+WL+xN5g23kLX1Hn/d13TlLbJyIeOYmMYjiJ\njGI4iYxiOImMYjiJjGI4iYxiOImMEqdcgvKczIXlXZ/SqKqZM9T24XnT1fZ8gz7kq+P4OrV9YFp4\ntw7O0OuYLbN61PaY2GVBa6vD69+7Tq/v1nTqy67frb+cJu/MB9saVq5X583v7VTbLXu8sKxkAZlH\nTiKjGE4ioxhOIqMYTiKjGE4ioxhOIqMYTiKj1DonER06PHISGcVwEhnFcBIZxXASGcVwEhnFcBIZ\n9X+0t/rKMaHLlAAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "def show(idx, title):\n",
        "  plt.figure()\n",
        "  plt.imshow(test_images[idx].reshape(28,28))\n",
        "  plt.axis('off')\n",
        "  plt.title('\\n\\n{}'.format(title), fontdict={'size': 16})\n",
        "\n",
        "import random\n",
        "rando = random.randint(0,len(test_images)-1)\n",
        "show(rando, 'An Example Image: {}'.format(class_names[test_labels[rando]]))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "TKnEHeTrbh3L"
      },
      "source": [
        "Ok, that looks interesting.  How hard is that for you to recognize? Now let's create the JSON object for a batch of  three inference requests, and see how well our model recognizes things:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "metadata": {
        "id": "2dsD7KQG1m-R"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Data: {\"signature_name\": \"serving_default\", \"instances\": ...  [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0]]]]}\n"
          ]
        }
      ],
      "source": [
        "import json\n",
        "data = json.dumps({\"signature_name\": \"serving_default\", \"instances\": test_images[0:3].tolist()})\n",
        "print('Data: {} ... {}'.format(data[:50], data[len(data)-52:]))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ReQd4QESIwXN"
      },
      "source": [
        "### Make REST requests"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "iT3J-lHrhOYQ"
      },
      "source": [
        "#### Newest version of the servable\n",
        "\n",
        "We'll send a predict request as a POST to our server's REST endpoint, and pass it three examples.  We'll ask our server to give us the latest version of our servable by not specifying a particular version."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "metadata": {
        "id": "vGvFyuIzW6n6"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\nkwAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "!pip install -q requests\n",
        "\n",
        "import requests\n",
        "headers = {\"content-type\": \"application/json\"}\n",
        "json_response = requests.post('http://localhost:8501/v1/models/fashion_model:predict', data=data, headers=headers)\n",
        "predictions = json.loads(json_response.text)['predictions']\n",
        "\n",
        "show(0, 'The model thought this was a {} (class {}), and it was actually a {} (class {})'.format(\n",
        "  class_names[np.argmax(predictions[0])], np.argmax(predictions[0]), class_names[test_labels[0]], test_labels[0]))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YJH8LtM4XELp"
      },
      "source": [
        "#### A particular version of the servable\n",
        "\n",
        "Now let's specify a particular version of our servable.  Since we only have one, let's select version 1.  We'll also look at all three results."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "metadata": {
        "id": "zRftRxeR1tZx"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\nkwAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        },
        {
          "data": {
            "image/png": "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\nhL7S9iea2ZfNuzB0x/P9CzPbJHO8zZbZj5nZ38zrjWfM7KbitW5mB5vZ9Wa2LK5nvpl9tryeolTd\np7Xf7xal6VdKelb+1ClruBPlyZJ+KulCeevMPEnfNbMDGjOYP/r7i6TXSPq4vFn8Zkm/MLPDm9zO\nj+SV+zskXSbpv8zsDPkjxDMkHS1poqTLzGxsYbkvSvqavMn97ZK+Ij9JlxcLmrxF7TBJp8R19Ur6\ndnkn4gX9C0l3STpK/gjnVfJfMes1eSySPypsJF3v1NpuLcUuA8dKOlTSxyS9V9LW8l9DxYSq2eNr\n1ufk5+AC+fd5paT/ycz/K0lXSzpC/r18TlLjAmnmGIv2jv/OLMx7XiFeW9bKzJPdC+W/Lo+Qf2fn\nKp883SJpqdbtAnKgpNWJab2Sro2fN5TUJelk+SOgT0raUdKfrJDQyc/LFpI+LOlg+WPybtVfm1tI\n+rr82GdIekrStWb26prlqjT6ry4d5PKVzGxzSdfJr/l/k/+yXyovl2+Ns/1G0jJ5OS8uu4mkg+Rl\nsOFCSZ+Wf/+Hyh+vvV/STxKbP1XSTpL+VV5fdFXs4zh5N5Q/JsIXy6+t38nLzQfl1/xmlQctbSfp\nKvlj/0PlddbpcT2NbWbLo/mjwt9L6pN/x2+V9HnVPAmsOL5XSJom6W+J8LXysjcYW0u6Vf7I8xBJ\n35Qf8/mJebeP8a9JOlJ+7V9iZjsU9vPN8u/1njjPV+MyOw9i3z4iv35v19o65COpGWOCcK3S1/ke\nZjYx7t/O8mvv6sJ8zVyLX5eX+8/JH/kfLz9vubpH8nJ0qaR3y8vIbySdl0gmc2W01bo3ty/ZMt2k\n70razQb2jf9XSSuVvo4bxklaT348h8rrzU5JfzazTVvcj4aRrPt2lV/fG8jLxnvk965rzOw1cbaf\nSmqX5xrFZV8n6RWKdV+81/9entR+U14fnCfpM0p3n/q2JJN0nDLJoJltI2kXleq+mDvNlnSC/D58\nmLz+XhKPp0ptmTWzd8u7/F0k6W1x3ksVuwaZ2XbyXOMB+Xk5XF5vTMxst8qb4r/r1H0hhF5Jf5bX\nW3khhKb/k/SgpAsrYjMlBUkHFKaNk7RY0vcL034gb9mYWlp+tqRba7Y/I27js4VpY+QVU4+kbQvT\nD4/zvil+3lCegMwsrfPYON/h8fNb4udjSvNdEafvHz9Pkt/Yf1iab1v5I4x/L523mU0e2w6JWJDf\n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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "headers = {\"content-type\": \"application/json\"}\n",
        "json_response = requests.post('http://localhost:8501/v1/models/fashion_model/versions/1:predict', data=data, headers=headers)\n",
        "predictions = json.loads(json_response.text)['predictions']\n",
        "\n",
        "for i in range(0,3):\n",
        "  show(i, 'The model thought this was a {} (class {}), and it was actually a {} (class {})'.format(\n",
        "    class_names[np.argmax(predictions[i])], np.argmax(predictions[i]), class_names[test_labels[i]], test_labels[i]))"
      ]
    }
  ],
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "collapsed_sections": [],
      "name": "rest_simple.ipynb",
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
